#ifndef THREADMANGER_H
#define THREADMANGER_H

/*该类为线程管理类，消息收发的接口类
 *内部维护消息线程，通过getInstance接口提供socket给底层messageclass进行通讯
 *有消息则发送haveNewMessage信号
 */



#include <QObject>
#include <QThread>
#include <QTcpSocket>
#include "AbstractLayer/Network/messageclass.h"
#include "AbstractLayer/Database/databaseclass.h"
#include "AbstractLayer/AvatarLib/avatarlib.h"
#include "AbstractLayer/Database/contactlib.h"
#include "AbstractLayer/Database/friendlistlib.h"
#include "AbstractLayer/FileTransmisson/sendqueue.h"
#include "AbstractLayer/FileTransmisson/sendfileclass.h"
#include "AbstractLayer/FileTransmisson/recvfileclass.h"
#include "AbstractLayer/FileTransmisson/filelocalclass.h"
#include "UserLayer/GUI/MyFavoritesWidget/favoritelib.h"
#include "AbstractLayer/Database/friendapplylib.h"

#include <QSet>
class MessageClass;
class ThreadManger : public QObject
{
    Q_OBJECT
public:
    ThreadManger(ThreadManger&)=delete;
    ThreadManger& operator=(ThreadManger&)=delete;
    static ThreadManger* getInstance();
    //接口函数
    void sendMessage(QString senderoc,QString targetoc,QString str);
    void sendVerify(QString user,QString password);
    void initNetwork(QString addr,qint64 port);
    void initDatabase();
    void initFileTransmisson();
    void initSetting();
    void loadAvatarFromFile();
    void initFileLocal(const QString& useroc);
    void loadLastPage();
    void loadFriendListDB();
    void loadContactListDB();
    void loadLastest();
    void loadFavorite();
    void addChat(QString mettingoc,QString content,bool sender);
    void refreshCurMeeting(QString oc);
    void refreshLastestDB(QSet<QString>);
    void writeChatBufNow();
    void destroyThreadManger();
    void deleteContactDB(QString oc);
    void addSaveFile(QPair<QString,QString>);
    void addFileTask(QString senderoc,QString receiveroc,QString filepath);
    void initRecvFile(const QString& useroc);
    void addFavorite(QString,QString,QString);
    void saveFavorite(QPair<QString,QString>);
    void deleteFile(QString filepath);
    void deleteFavoriteDB(QString filename);
    void setUserAvatar(QString path);
    void refreshAvatar();
    void updateUser(QString oldoc,QString oc,QString name);
    void updateUserOcFile();
    void logout(QString oc);
    void clearLib();
    void sendUserAvatar(QString useroc,QString path);
    void sendUserNameUpdate(QString useroc,QString newname);
    void sendUserOCUpdate(QString newuseroc);
    void sendSignup(QString useroc,QString username,QString password,QString avatar);
    void createNewDatabase(QString username);
    void haveSignupRes(QString res);
    void createNewUserAvatar();
    void addToFriendList(const QString &oc, const QString &name, const QString &lastest="");
    void sendGetUserInfo(const QString& useroc);
    void setNewUserOC(QString useroc);
    QString getNewUserOC();
    void setMesCurrentOC(const QString& useroc);
    void transUserinfo(const QString& username);
    void transCreateDirDone();
    void setDBUseroc(const QString& useroc);
    void deleteDatabase();
    void sendGetContactList();
    void createNewChatHistroyTable(const QString& friendoc);
    void sendSearchFriend(const QString& friendoc);
    //void recvSearchFriendDone(const QList<QString>&);
    void recvSearchFriendDone(const QString&);
    void sendFriendApply(const QString& friendoc);
    void friendApplyResult(const QString& friendoc,const QString& friendname);
    void removeFriendOne(const QString& friendoc);
    void removeFriendList(const QStringList& friendoclist);
    void addFriendApply(const QString& friendoc,const QString& friendname,const EnumLib::ApplyStatus status);
    void upDataFriendApplyStatus(const QString friendoc,const EnumLib::ApplyStatus newstatus);
    void loadFriendApply();
    void friendApplyDone();
    void sendFriendResult(const QString &friendoc);
    void moveAvatarCacheToAvatar(const QString& friendoc);
    void addContact(const QString& friendoc,const QString& friendname);
    void appendAvatar(const QString& useroc,const QString& oc);
    void deleteAvatar(const QString& oc);
    void dropChatHistroyTable(const QString &oc);
    void hideChat(const QString& friendoc);
    void deleteChat(const QString& friendoc);
    //优化措施，移除记录，重新加载信息列表
    void deleteFriendRowAndLoad(const QString& friendoc);
    //优化措施，移除记录，删除记录表，重新加载信息列表
    void deleteDropFriendAndLoad(const QString& friendoc);
    void getFriendLastest(const QString& friendoc);
    void doFriendApplyPass(const QString& friendoc,const QString& friendname);
    void haveNewFile(const QString& friendoc,const QString& content);
    void flushSettings();
signals:
    //线程发送工作信号
    void s_haveVerify(QByteArray message);
    void s_init(QString addr,qint64 port);
    void s_initFileTransmisson();
    void s_doSend(QString,QString,QString);
    void s_sendVerify(QString,QString);
    void s_doLoad();
    void s_initMyDatabase();
    void s_loadLastPageDB();
    void s_loadFriendDB();
    void s_addChat(QString mettingoc,QString content,bool sender);
    void s_setHistroyOC(QString oc);
    void s_refresh();
    void s_loadContactDB();
    void s_haveNewMessage(QPair<QString, QString>);
    void s_loadLastest();
    void s_refreshLastestDB(QSet<QString>);
    void s_deleteContactDB(QString);
    void s_addSendFile(QPair<QString,QString>);
    void s_addFileTask(QString senderoc,QString receiveroc,QString filepath);
    void s_speed(float value);
    void s_sendStartWork(QString);
    void s_fileDone();
    void s_haveNewFile(const QString& senderoc,const QString& content);
    void s_initRecvFile(const QString& useroc);
    void s_addFavorite(QString,QString,QString);
    void s_loadFavorite();
    void s_saveFavorite(QPair<QString,QString>);
    void s_deleteFile(QString filepath);
    void s_deleteFavoriteDB(QString);
    void s_setUserAvatar(QString);
    void s_updateUser(QString oldoc,QString oc,QString name);
    void s_initSetting();
    void s_logout(QString oc);
    void s_freshUser();
    void s_clearLib();
    void s_sendUserAvatar(QString,QString);
    void s_sendUserNameUpdate(QString,QString);
    void s_sendUserOCUpdate(QString);
    void s_sendSignup(QString useroc,QString username,QString password,QString avatar);
    void s_updateUserOcFile(QString newuseroc);
    void s_createNewDatabase(QString username);
    void s_haveSignupRes(QString res);
    void s_addToFriendList(const QString &oc, const QString &name, const QString &lastest="");
    void s_sendGetUserInfo(const QString& useroc);
    void s_setRecvOC(QString useroc);
    void s_deleteDB();
    void s_createNewUserAvatar();
    void s_setMesCurrentOC(const QString& useroc);
    void s_getUserName(const QString& username);
    void s_transCreateDirDone();
    void s_setDBUseroc(const QString& useroc);
    void s_initFileLocal(const QString& useroc);
    void s_sendGetContactList();
    void s_createNewChatHistroyTable(const QString& friendoc);
    void s_sendSearchFriend(const QString& friendoc);
    //void s_recvSearchFriendDone(const QList<QString>&);
    void s_recvSearchFriendDone(const QString&);
    void s_sendFriendApply(const QString& friendoc);
    void s_friendApplyResult(const QString& friendoc,const QString& friendname);
    void s_addContact(const QString& friendoc,const QString& friendname);
    void s_moveAvatarCacheToAvatar(const QString&);
    void s_appendAvatar(const QString& oc,const QString& friendoc);
    void s_removeFriendOne(const QString& friendoc);
    void s_removeFriendList(const QStringList& friendoclist);
    void s_addFriendApply(const QString& friendoc,const QString& friendname,const EnumLib::ApplyStatus status);
    void s_upDataFriendApplyStatus(const QString friendoc,const EnumLib::ApplyStatus newstatus);
    void s_loadFriendApply();
    void s_friendApplyDone();
    void s_sendFriendResult(const QString &friendoc);
    void s_deleteAvatar(const QString& oc);
    void s_dropChatHistroyTable(const QString &oc);
    void s_hideChat(const QString& friendoc);
    void s_deleteChat(const QString& friendoc);
    void s_deleteFriendRowAndLoad(const QString& friendoc);
    void s_deleteDropFriendAndLoad(const QString& friendoc);
    void s_getFriendLastest(const QString& friendoc);
    void s_reset();
    void s_resetTimer();
    void s_updateFriendApply(const QString& friendoc,const QString& friendname,const EnumLib::ApplyStatus status);
    void s_flushSettings();
public slots:
    void sendNewMessageToUi(QPair<QString, QString>);
    void dealVerify(QByteArray recv);
    void sendSpeed(float value);
    void sendstartWork(QString);
    void sendFileDone();
private:
    ThreadManger()=default;
    QString ip;
    qint64 port;
    static QString newUserOC;
    //底层消息收发类
    static MessageClass* messageclass;
    //底层数据库操作类
    static DatabaseClass* databaseclass;
    //发送文件类
    static SendFileClass* fileclass;
    //本地文件类
    static FileLocalClass* filelocalclass;
    //接收文件类
    static RecvFileClass* recvfileclass;
    //消息线程
    static QThread* messagethread;
    //数据库线程
    static QThread* databasethread;
    //发送文件线程
    static QThread* filethread;
    //本地文件线程
    static QThread* filelocalthread;
    //接收文件线程
    static QThread* recvfilethread;
    //单例，线程管理类
    static ThreadManger* threadmanger;

};
#endif // THREADMANGER_H
